package org.example.Utils;

//文字样式类
public class ConsoleTextStyle {

    private ConsoleTextStyle() {
    }
    /**
     * 构造函数
     * @param color 文本颜色
     * */
    public ConsoleTextStyle(int color) {
        this.color = color;
    }

    /**
     * 构造函数
     * @param color 文本颜色
     * @param backgroundColor 背景颜色
     * */
    public ConsoleTextStyle( int color,int backgroundColor) {
        this.backgroundColor = backgroundColor;
        this.color = color;
    }

    /**
     * 构造函数
     * @param r 文本颜色R
     * @param g 文本颜色G
     * @param b 文本颜色B
     * @param backgroundColorR 背景颜色R
     * @param backgroundColorB 背景颜色B
     * @param backgroundColorG 背景颜色G
     * */
    public ConsoleTextStyle(int r, int g, int b, int backgroundColorR, int backgroundColorB, int backgroundColorG) {
        this.color = 38;
        R = r;
        G = g;
        B = b;
        this.backgroundColor = 48;
        this.backgroundColorR = backgroundColorR;
        this.backgroundColorB = backgroundColorB;
        this.backgroundColorG = backgroundColorG;
    }

    //颜色 30 - 38
    private int color = 0;
    // 自定义 颜色
    private int R = 0;
    private int G = 0;
    private int B = 0;

    //背景颜色 40 - 48
    private int backgroundColor = 0;
    // 自定义 背景颜色
    private int backgroundColorR = 0;
    private int backgroundColorG = 0;
    private int backgroundColorB = 0;

    //文本样式 1 - 9
    // 0: 重置所有属性
    // 1: 加粗/高亮
    // 2: 弱化(变淡)
    // 3: 斜体
    // 4: 下划线
    // 7: 反显(前景背景互换)
    // 9: 删除线
    // 1 加粗/高亮
    private boolean bold = false;
    // 2 弱化(变淡)
    private boolean weaken = false;
    // 3 斜体
    private boolean italic = false;
    // 4 下划线
    private boolean underline = false;
    // 7 反显(前景背景互换)
    private boolean reverse = false;
    // 9 删除线
    private boolean deleteLine = false;

    /**
     * 获取文本颜色字符串
     * */
    private String getTextColor() {
        if (color == 0) {
            return "";
        }
        // 检测
        if (color >= 30 && color <= 37) {
            return color + "";
        }

        // 自定义 颜色
        if (color == 38) {
            return "38;2;" + R + ";" + G + ";" + B;
        }

        // 直接返回 0
        return "0";
    }

    /**
     * 获取背景颜色字符串
     * */
    private String getBackgroundColorString() {
        if (backgroundColor == 0) {
            return "";
        }
        // 检测
        if (backgroundColor >= 40 && backgroundColor <= 47) {
            return ";" + backgroundColor;
        }

        // 自定义 颜色
        if (backgroundColor == 48) {
            return ";48;2;" + backgroundColorR + ";" + backgroundColorG + ";" + backgroundColorB;
        }

        // 直接返回 0
        return "0";
    }

    /**
     * 获取控制台文本样式参数
     * */
    private String getTextStyleString() {
        return new StringBuilder()
                       // 文本样式
                       // 1 加粗/高亮
                       .append(bold ? ";1" : "")
                       // 2 弱化(变淡)
                       .append(weaken ? ";2" : "")
                       // 3 斜体
                       .append(italic ? ";3" : "")
                       // 4 下划线
                       .append(underline ? ";4" : "")
                       // 7 反显(前景背景互换)
                       .append(reverse ? ";7" : "")
                       // 9 删除线
                       .append(deleteLine ? ";9" : "")
                       .toString();
    }

    /**
     * 获取控制台文本样式
     * */
    public String getConsoleTextStyle() {
        return new StringBuilder()
                       .append("\u001B[")
                       .append(getTextColor())
                       .append(getTextStyleString())
                       .append(getBackgroundColorString())
                       .append("m")
                       .toString();
    }
    /**
     * 获取重置样式
     * */
    public static String getReset() {
        return "\u001B[0m";
    }

    /**
     * 获取控制台文本样式参数
     **/
    public String getStyleParameters() {
        return "控制台文本样式参数:" +
                       "文本颜色:" + getTextColor() +
                       "文本样式:" + getTextStyleString() +
                       "背景颜色:" + getBackgroundColorString()
                       + "样式：" + "\\u001B[" +
                       getTextColor() +
                       getTextStyleString() +
                       getBackgroundColorString() +
                       "m";
    }

    public ConsoleTextStyle setBold(boolean bold) {
        this.bold = bold;
        return this;
    }

    public ConsoleTextStyle setWeaken(boolean weaken) {
        this.weaken = weaken;
        return this;
    }

    public ConsoleTextStyle setItalic(boolean italic) {
        this.italic = italic;
        return this;
    }

    public ConsoleTextStyle setUnderline(boolean underline) {
        this.underline = underline;
        return this;

    }

    public ConsoleTextStyle setReverse(boolean reverse) {
        this.reverse = reverse;
        return this;

    }

    public ConsoleTextStyle setDeleteLine(boolean deleteLine) {
        this.deleteLine = deleteLine;
        return this;
    }
}
